package com.farm.system.service.impl;

import com.farm.constant.MessageConstant;
import com.farm.system.dao.RoleMapper;
import com.farm.system.pojo.Role;
import com.farm.system.pojo.User;
import com.farm.system.service.RoleService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import java.util.List;
import java.util.Map;

/**
 * 角色实现类
 *
 * @author Chengfei
 * @date 2020/10/11
 */
@Service
@Transactional
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleMapper roleMapper;

    /**
     * 查询所有角色
     *
     * @return 角色集合
     */
    @Override
    public List<Role> findAll() {
        List<Role> roleList = roleMapper.selectAll();
        if (roleList == null || roleList.size() <= 0) {
            throw new RuntimeException(MessageConstant.SELECT_ALL_ROLE_FAIL);
        }

        return roleList;
    }

    /**
     * 条件分页查询
     *
     * @param page      页码
     * @param size      大小
     * @param searchMap 条件
     * @return 角色集合
     */
    @Override
    public Page<Role> findPageByCondition(Integer page, Integer size, Map<String, Object> searchMap) {

        //开启分页助手
        PageHelper.startPage(page, size);

        //调用方法添加条件
        Example example = createExample(searchMap);
        List<Role> roleList = roleMapper.selectByExample(example);

        //判断数据是否有效
        if (roleList == null || roleList.size() <= 0) {
            throw new RuntimeException(MessageConstant.SELECT_ROLE_FAIL);
        }

        return (Page<Role>) roleList;
    }

    /**
     * 条件构造器
     *
     * @param searchMap 条件
     * @return
     */
    public Example createExample(Map<String, Object> searchMap) {
        Example example = new Example(Role.class);
        Example.Criteria criteria = example.createCriteria();

        //判断条件数据是否有效
        if (searchMap != null && searchMap.size() > 0) {

            //判断角色名是否存在,存在添加为模糊查询条件
            if (org.apache.commons.lang.StringUtils.isNotBlank((String) searchMap.get("role"))) {
                criteria.andLike("role", "%" + searchMap.get("role") + "%");
            }
            //判断关键字是否存在,存在添加为模糊查询条件
            if (org.apache.commons.lang.StringUtils.isNotBlank((String) searchMap.get("keyword"))) {
                criteria.andLike("keyword", "%" + searchMap.get("keyword") + "%");
            }

        }
        return example;
    }

    /**
     * 新增角色
     *
     * @param role    角色
     * @param menuIds 菜单id数组
     */
    @Override
    public void add(Role role, Integer[] menuIds) {
        //判断数据是否有效
        if (role == null) {
            throw new RuntimeException(MessageConstant.ADD_ROLE_FAIL);
        }

        //向角色表添加数据
        roleMapper.insertSelective(role);

        //向角色-菜单表添加数据
        setRoleIdAndMenuId(role.getId(), menuIds);
    }

    /**
     * 更新角色
     *
     * @param role    角色
     * @param menuIds 菜单id数组
     */
    @Override
    public void update(Role role, Integer[] menuIds) {
        //判断角色是否有效
        if (role == null) {
            throw new RuntimeException(MessageConstant.UPDATE_ROLE_FAIL);
        }
        //删除角色-菜单表
        roleMapper.deleteAssociation(role.getId());

        //添加角色-菜单表
        setRoleIdAndMenuId(role.getId(), menuIds);

        //修改角色
        roleMapper.updateByPrimaryKeySelective(role);

    }

    /**
     * 删除角色
     *
     * @param roleId 角色id
     */
    @Override
    public void delete(Integer roleId) {
        //判断角色是否被用户使用,被使用无法删除
        int count = roleMapper.selectCountByRoleId(roleId);
        if (count > 0) {
            throw new RuntimeException(MessageConstant.DELETE_ROLE_FAIL);
        }

        //删除角色菜单表
        roleMapper.deleteAssociation(roleId);

        //删除角色表
        roleMapper.deleteByPrimaryKey(roleId);

    }

    /**
     * 添加角色-菜单表
     *
     * @param roleId  角色id
     * @param menuIds 菜单id数组
     */
    private void setRoleIdAndMenuId(Integer roleId, Integer[] menuIds) {
        //判断菜单id数组数据是否有效
        if (menuIds == null || menuIds.length <= 0) {
            return;
        }
        //遍历添加角色-菜单表
        for (Integer menuId : menuIds) {
            roleMapper.setRoleIdAndMenuId(roleId, menuId);
        }

    }


}
